#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
 #include <stdio.h>

#if 1
class CSingleton
{ 
    // 其它成员  
public:  
    static CSingleton* GetInstance()
    {
        if ( m_pInstance == NULL ) //判断是否第一次调用
            m_pInstance = new CSingleton();
            return m_pInstance;
    }
    //virtual ~CSingleton(){ delete CSingleton::Garbo; printf("0004\n"); };
    virtual ~CSingleton(){  printf("0004\n"); };  

    int test01();
//private:
public:
    CSingleton(){ printf("0003\n"); };
    //~CSingleton(){ printf("0004\n"); };  
    static CSingleton * m_pInstance;  
    class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例  
    { 
    public: 
        ~CGarbo() 
        {  
            if (CSingleton::m_pInstance) 
                delete CSingleton::m_pInstance; 
            printf("0002\n");
        } 
    }; 
    static CGarbo Garbo; // 声明一个静态成员，在程序结束时，系统会调用它的析构函数，注意这里仅仅是声明，还需要在相应的cpp文件中对静态成员进行定义哦。 
};

CSingleton* CSingleton::m_pInstance = CSingleton::GetInstance();
CSingleton::CGarbo CSingleton::Garbo;   //这个很重要
        //CSingleton* CSingleton::m_pInstance = CSingleton::GetInstance();
        //CSingleton::CGarbo CSingleton::Garbo;   //这个很重要


class CTest
{
public:
    CTest()
    {
//CSingleton* CSingleton::m_pInstance = CSingleton::GetInstance();
//CSingleton::CGarbo CSingleton::Garbo;   //这个很重要
        m_single=CSingleton::GetInstance();;
        printf("A003\n"); 


    };
    virtual ~CTest(){};

    CSingleton* m_single;
//CSingleton::m_pInstance
};


#if 0
//CSingleton* CSingleton::m_pInstance = NULL;
CSingleton* CSingleton::m_pInstance = CSingleton::GetInstance();
CSingleton::CGarbo CSingleton::Garbo;   //这个很重要
#endif

#endif

#if 0
class CSingleton
{ 
    // 其它成员  
public:  
    static CSingleton* GetInstance()
    {
        static CSingleton inst;
        return &inst;
    }

    int test01();
private:  
    CSingleton(){ printf("0003\n"); };
    ~CSingleton(){ printf("0004\n"); };

             CSingleton( const CSingleton& ){};
            //CSingleton& operate = ( const CSingleton& ){};



};
#endif


int CSingleton::test01()
{
    printf("001\n");
    return 0;
}

int test01()
{
    CTest* test=new CTest;
    test->m_single->test01();
#if 0
	CSingleton* pObjTtyRw = CSingleton::GetInstance();
    pObjTtyRw->test01();
    sleep(1);
 		//delete pObjTtyRw;
		return -1;
#endif
    //CSingleton::GetInstance()->test01();
    return 0;
}

int main()
{

    test01();

    //while(1)
    {
        sleep(1);
    }

}